/* 
 * File:   primitive.h
 * Author: chaterolas
 *
 * Created on 24 de junio de 2009, 07:40 PM
 */

#ifndef _PRIMITIVE_H
#define	_PRIMITIVE_H

#define BOX 0
#define SPHERE 1
#define PLANE 2
#define TRIANGLE 3
#define SURFACE 4
#define SUN 5
#define POINT 6

#define INSIDE -1
#define MISS 0
#define HIT 1

#include <math.h>
#include <stdlib.h>
#include "../base/ray.h"
#include "../base/material.h"

class Primitive {
public:
    /**
     * Calcula la interseccion del rayo r con este primitivo
     * @param r (rayo a intersectar)
     * @return t (escalar por el que hay que alargar el rayo
     * considerando su direccion unitaria)
     */
    virtual double intersect(Ray *r) {}

    /**
     * Calcula el vector ortonormal a este primitivo que pasa por el punto pos.
     * @param pos (punto desde el cual se quiere obtener el vector normal)
     * @return vector (vector ortonormal a este primitivo y
     * que pasa por el punto pos)
     */
    virtual Vector3D *getNormal(Vector3D &pos) {}

    /**
     * Regresa el tipo de primitivo que representa este.
     * @return type (tipo asociado a este primitivo)
     */
    virtual int getType() {}
    
    Material *getMaterial();
    int isLight();

protected:
    int light;
    Material *material;

};

#endif	/* _PRIMITIVE_H */

